package com.loopj.android.image;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.os.Build.VERSION;
import android.support.v4.util.LruCache;

/**
 * 运行时存缓存类
 * <p>使用LruCache 类进行缓存，使用运行时最大内存空间的三分之一来进行图片缓存</p>
 * 
 * @author lwz
 */
public class MemoryCache {

	private static MemoryCache INSTANCE;
	private LruCache<String, Bitmap> mMemoryCache = null;
	
	private MemoryCache() {
		int maxMemorySize = (int)(Runtime.getRuntime().maxMemory());
		mMemoryCache = new LruCache<String, Bitmap>( maxMemorySize /3) {

			@Override
			protected int sizeOf(String key, Bitmap value) {
				return getBitmapCount(value);
			}
		};
	}
	
	/**
	 * 得到默认实例
	 * 
	 * @return
	 */
	public static MemoryCache getInstance() {
		if( INSTANCE == null ) {
			INSTANCE = new MemoryCache();
		}
		return INSTANCE;
	}
	
	@SuppressLint("NewApi")
	private int getBitmapCount(Bitmap bmp){
		if( VERSION.SDK_INT < 12  ) {
			return bmp.getRowBytes() * bmp.getHeight();
		} else {
			return bmp.getByteCount();
		}
	}
	
	/**
	 * 添加图片缓存
	 * @param key
	 * @param value
	 */
	public void put(String key, Bitmap value) {
		mMemoryCache.put(key, value);
	}
	
	/**
	 * 得到缓存图片对象
	 * @param key
	 * @return 当没有缓存时，返回 null
	 */
	public Bitmap get(String key) {
		return mMemoryCache.get(key);
	}
	
	/**
	 * 删除 key 对应的缓存图片
	 */
	public void remove(String key) {
		mMemoryCache.remove(key);
	}
	
	/**
	 * 清除所有的图片缓存
	 */
	public void clear() {
		mMemoryCache.evictAll();
		System.gc();
	}
}
